unit clsTransferenciaEntreEmpresas;

interface

uses
  SysUtils, clsPedidosVenda, clsNotaVenda, clsPedidocompra, clsItemPedVenda, clsNotaCompra,
  clsItemNotaVenda, DbTables, Classes;

type
  TTransferencia = class
  private
    { Private Declarations }
    FPedidoDeVenda: TPedidosVenda;
    FNotaDeVenda: TNotaVenda;
    FItensDaNota: TStringList;
    FItensDoPedido: TStringList;
    FPedidosNaNota: TStringList;
    FPedidosDeCompra: TStringList;
    FNotaDeCompra: String;
    FEmpresaOrigem: String;
    procedure SetNotaDeVenda(const Value: TNotaVenda);
    procedure SetPedidoDeVenda(const Value: TPedidosVenda);
    function GetNotaDeVenda: TNotaVenda;
    function GetPedidoDeVenda: TPedidosVenda;
    function GetItensDaNota: TStringList;
    function GetItensDoPedido: TStringList;
    procedure SetItensDaNota(const Value: TStringList);
    procedure SetItensDoPedido(const Value: TStringList);
    procedure SetEmpresaOrigem(const Value: String);
    function GetPedidosNaNota: TStringList;
    procedure SetPedidosNaNota(const Value: TStringList);
    function GetPedidosDeCompra: TStringList;
    procedure SetPedidosDeCompra(const Value: TStringList);
    procedure SetNotaDeCompra(const Value: String);

  public
    { Private Declarations }
    constructor Create(vPedidosVenda: TPedidosVenda; vNotaVenda: TNotaVenda; const cStrEMpresa: String);
    destructor DestroyAll;

    property PedidoDeVenda: TPedidosVenda read GetPedidoDeVenda write SetPedidoDeVenda;
    property NotaDeVenda: TNotaVenda read GetNotaDeVenda write SetNotaDeVenda;
    property ItensDaNota: TStringList read GetItensDaNota write SetItensDaNota;
    property ItensDoPedido: TStringList read GetItensDoPedido write SetItensDoPedido;
    property PedidosNaNota: TStringList read GetPedidosNaNota write SetPedidosNaNota;
    property PedidosDeCompra: TStringList read GetPedidosDeCompra write SetPedidosDeCompra;
    property NotaDeCompra: String read FNotaDeCompra write SetNotaDeCompra;
    property EmpresaOrigem: String read FEmpresaOrigem write SetEmpresaOrigem;

    procedure ConsultarPedido(const cStrPedido, cStrNota, cStrSerie, cStrEntidade: String);
    procedure ConsultarNota(const cStrNumero, cStrSerie, cStrEntidade: String);
    function RetornaItemPedido(const cStrChaveDoItem: String; var rStrItem, rStrPedido: String): TItemPedVenda;
    function RetornaItemNota(const cStrChaveDoItem: String; var rStrItem, rStrNumero, rStrSerie, rStrEntidade: String): TItemNotaVenda;
    function RetornaEntidade: String;
    function RetornaEmpresa(pEntidade: String): String;
    function RetornaSeEFaturado(const cStrPedido, cStrItem, cStrSerie, cStrNota, cStrEntidade: String): boolean;
    function RetornaReferencia(const cStrProduto: String): String;

    procedure GerarPedido;
    procedure GerarFatura(const cStrNota, cStrSerie: String);

  end;

implementation

uses
  dm, FrmCad_NotasCompra, Cad_PedidoCompra, clsSequencia, Biblio, clsParametros,
  clsMovItemPedVenda, clsBackup_pedido;

{ TTransferencia }

constructor TTransferencia.Create(vPedidosVenda: TPedidosVenda; vNotaVenda: TNotaVenda; const cStrEmpresa: String);
begin
  SetNotaDeVenda(vNotaVenda);
  SetPedidoDeVenda(vPedidosVenda);
  SetEmpresaOrigem(cStrEmpresa);
end;

destructor TTransferencia.DestroyAll;
begin
  FreeAndNil(FPedidoDeVenda);
  FreeAndNil(FNotaDeVenda);
end;

procedure TTransferencia.ConsultarNota(const cStrNumero, cStrSerie, cStrEntidade: String);
var
  tq:TQuery;
  itemNotaVenda: TItemNotaVenda;
begin
  GetNotaDeVenda.Recuperar(cStrSerie, cStrNumero, '', cStrEntidade);
  try
    tq := TQuery.Create(DmInt.Db);
    tq.DatabaseName := DmInt.Db.DatabaseName;
    tq.Active := false;
    itemNotaVenda := TItemNotaVenda.Create;
    itemNotaVenda.RecuperarPorNota2(tq, cStrSerie, cStrNumero, cStrEntidade);
    tq.Open;
    while not(tq.Eof) do begin
      ItensDaNota.Add(StrZero(tq.FieldByName('itnv_item').AsString, 3) +
        StrZero(tq.FieldByName('nota_numero').AsString, 9) +
        CritPadR(tq.FieldByName('nota_serie').AsString, 3, ' ') +
        StrZero(tq.FieldByName('ent_codigo').AsString, 5));
      tq.Next;
    end;
  finally
    FreeAndNil(tq);
  end;
end;

procedure TTransferencia.ConsultarPedido(const cStrPedido, cStrNota, cStrSerie, cStrEntidade: String);
var
  tq:TQuery;
  itemPedVenda: TItemPedVenda;

begin
  GetPedidoDeVenda.Recuperar(cStrPedido, '');
  try
    tq := TQuery.Create(DmInt.Db);
    tq.DatabaseName := DmInt.Db.DatabaseName;
    tq.Active := false;
    itemPedVenda := TItemPedVenda.Create;
    itemPedVenda.Consultar(tq, cStrPedido);
    ItensDoPedido.Clear;
    tq.Open;
    while not(tq.Eof) do begin
      if (RetornaSeEFaturado(tq.FieldByName('ped_Numero').AsString,
        tq.FieldByName('ped_item').AsString, cStrSerie, cStrNota, cStrEntidade)) then begin
        ItensDoPedido.Add(StrZero(tq.FieldByName('ped_item').AsString, 3) +
          StrZero(tq.FieldByName('ped_Numero').AsString, 9));
      end;
      tq.Next;
    end;
  finally
    FreeAndNil(tq);
    FreeAndNil(itemPedVenda);
  end;
end;

procedure TTransferencia.GerarFatura(const cStrNota, cStrSerie: String);
var
  //sequencia: TSeq_Pedido;
  parametros: TParametros;
  shift: TShiftState;
  wrdKey: word;
  i: integer;

begin
  try
    if (NotaDeVenda.Emp_codigo <> '') then begin
      FrmCad_NotaCompra := TFrmCad_NotaCompra.Create(nil);
      FrmCad_NotaCompra.FormActivate(nil);
      parametros := TParametros.Create;
      parametros.Recuperar('1');
         
      wrdKey := 12;
      FrmCad_NotaCompra.edtCodEmpresa.Text := PedidoDeVenda.Emp_codigo;
      FrmCad_NotaCompra.EdtNumNota.Text := cStrNota;
      FrmCad_NotaCompra.EdtNumSerie.Text := cStrSerie;
      FrmCad_NotaCompra.EdtEntCodigo.Text := RetornaEntidade;
      FrmCad_NotaCompra.EdtEntCodigoKeyDown(nil, wrdKey, shift);

      SetNotaDeCompra(FrmCad_NotaCompra.EdtNumNota.Text);

      for i := 0 to PedidosDeCompra.Count - 1 do begin
        FrmCad_NotaCompra.EdtPed_numero.Text := PedidosDeCompra[i];

        FrmCad_NotaCompra.EdtPed_numeroKeyDown(nil, wrdKey, shift);
        FrmCad_NotaCompra.bcolocar_todosClick(nil);

      end;

      FrmCad_NotaCompra.TabSheet4Enter(nil);

      FrmCad_NotaCompra.EdtCodFiscal.Text := parametros.CodF_Entrada_Transferencia;
      FrmCad_NotaCompra.EdtCodFiscalExit(nil);
      FrmCad_NotaCompra.EdtCodNatureza.Text := '01';
      FrmCad_NotaCompra.EdtCodNaturezaKeyDown(nil, wrdKey, shift);

      FrmCad_NotaCompra.TabSheet5Enter(nil);

      FrmCad_NotaCompra.btnGravarClick(nil);

    end;

  finally
    FreeAndNil(FrmCad_NotaCompra);
    FreeAndNil(parametros);

  end;

end;

procedure TTransferencia.GerarPedido;
var
  sequencia: TSequencia;
  strItem: String;
  strNumero: String;
  strPedido1, strPedido2: String;
  itemPedVenda:TITemPedVenda;
  backupPedido: TBackupPedido;
  i: integer;

begin
  try
    if (PedidoDeVenda.Ent_codigo <> '') then begin
      FrmCad_PedidoCompra := TFrmCad_PedidoCompra.Create(nil);
      sequencia := TSequencia.Create;

      FrmCad_PedidoCompra.EdtPed_numero.Text := sequencia.Ultimo_PedCompra;

      PedidosDeCompra.Add(FrmCad_PedidoCompra.EdtPed_numero.Text);

      FrmCad_PedidoCompra.EdtEnt_codigo.Text := RetornaEntidade;
      FrmCad_PedidoCompra.EdtPed_dataped.Date := PedidoDeVenda.Ped_dataped;
      FrmCad_PedidoCompra.EdtPed_datache.Date := PedidoDeVenda.Ped_datache;
      FrmCad_PedidoCompra.ed_data_prevfat.Date := PedidoDeVenda.Ped_datache;
      FrmCad_PedidoCompra.ed_regrapag.Text := PedidoDeVenda.Reg_codigo;
      FrmCad_PedidoCompra.ed_condfat.Text := PedidoDeVenda.Conf_codigo;
      FrmCad_PedidoCompra.EdtDiv_codigo.Text := PedidoDeVenda.Div_codigo;
      FrmCad_PedidoCompra.EdtEmp_codigo.Text := retornaEmpresa(PedidoDeVenda.Ent_Codigo);//PedidoDeVenda.Emp_codigo;
      FrmCad_PedidoCompra.EdtTran_codigo.Text := PedidoDeVenda.Tran_codigo;
      FrmCad_PedidoCompra.EdtPed_pedforn.Text := '';
      FrmCad_PedidoCompra.EdtPed_pedrepre.Text := '';
      FrmCad_PedidoCompra.EdtObservacao.Text := '';
      FrmCad_PedidoCompra.EdtEnt_observacao.Text := '';
      FrmCad_PedidoCompra.EdtPed_obs1.Text := '';
      FrmCad_PedidoCompra.EdtPed_obs2.Text := '';
      FrmCad_PedidoCompra.EdtPed_obs3.Text := '';
      FrmCad_PedidoCompra.EdtPed_obs4.Text := '';
      FrmCad_PedidoCompra.EdtPed_obs5.Text := '';

      for i := 0 to ItensDoPedido.Count - 1 do begin
        itemPedVenda := RetornaItemPedido(ItensDoPedido[i], strItem, strNumero);
        FrmCad_PedidoCompra.BtnInsereItemClick(nil);
        FrmCad_PedidoCompra.EdtPed_Item.Text := StrZero(strItem, 02);
        FrmCad_PedidoCompra.EdtPro_codigo.Text := RetornaReferencia(itemPedVenda.Pro_codigo);
        FrmCad_PedidoCompra.EdtItpc_quantidade.Value := itemPedVenda.Itpv_quantidade;
        FrmCad_PedidoCompra.EdtItpc_valorunit.Value := itemPedVenda.Itpv_valorunit;
        FrmCad_PedidoCompra.EdtItpc_aliqicms.Value := 0;
        FrmCad_PedidoCompra.EdtValor_desconto.Value := 0;
        FrmCad_PedidoCompra.edtPrevEntr.Date := itemPedVenda.Itpv_previsao;
        FrmCad_PedidoCompra.edtCst.Text := itemPedVenda.Itpv_CodTributario;
        FrmCad_PedidoCompra.edtItem_Observacao.Text := itemPedVenda.Itpv_Observacao;
        FrmCad_PedidoCompra.BtnConfirmaItemClick(nil);
      end;

      FrmCad_PedidoCompra.btnGravarClick(nil);

    end;

  finally
    FreeAndNil(FrmCad_PedidoCompra);
    FreeAndNil(sequencia); 
    FreeAndNil(backupPedido);

  end;

end;

function TTransferencia.GetNotaDeVenda: TNotaVenda;
begin
  if (Self.FNotaDeVenda = nil) then begin
    Self.FNotaDeVenda := TNotaVenda.Create;
  end;
  Result := Self.FNotaDeVenda;
end;

function TTransferencia.GetPedidoDeVenda: TPedidosVenda;
begin
  if (Self.FPedidoDeVenda = nil) then begin
    Self.FPedidoDeVenda := TPedidosVenda.Create;
  end;
  Result := Self.FPedidoDeVenda;
end;

procedure TTransferencia.SetNotaDeVenda(const Value: TNotaVenda);
begin
  FNotaDeVenda := Value;
end;

procedure TTransferencia.SetPedidoDeVenda(const Value: TPedidosVenda);
begin
  FPedidoDeVenda := Value;
end;

function TTransferencia.GetItensDaNota: TStringList;
begin
  if (Self.FItensDaNota = nil) then begin
    Self.FItensDaNota := TStringList.Create;
  end;
  Result := Self.FItensDaNota;
end;

function TTransferencia.GetItensDoPedido: TStringList;
begin
  if (Self.FItensDoPedido = nil) then begin
    Self.FItensDoPedido := TStringList.Create;
  end;
  Result := Self.FItensDoPedido;
end;

procedure TTransferencia.SetItensDaNota(const Value: TStringList);
begin
  FItensDaNota := Value;
end;

procedure TTransferencia.SetItensDoPedido(const Value: TStringList);
begin
  FItensDoPedido := Value;
end;

procedure TTransferencia.SetEmpresaOrigem(const Value: String);
begin
  FEmpresaOrigem := Value;
end;

function TTransferencia.GetPedidosNaNota: TStringList;
begin
  if (Self.FPedidosNaNota = nil) then begin
    Self.FPedidosNaNota := TStringList.Create;
  end;
  Result := Self.FPedidosNaNota;
end;

procedure TTransferencia.SetPedidosNaNota(const Value: TStringList);
begin
  FPedidosNaNota := Value;
end;

function TTransferencia.GetPedidosDeCompra: TStringList;
begin
  if (Self.FPedidosDeCompra = nil) then begin
    Self.FPedidosDeCompra := TStringList.Create;
  end;
  Result := Self.FPedidosDeCompra;
end;

procedure TTransferencia.SetPedidosDeCompra(const Value: TStringList);
begin
  FPedidosDeCompra := Value;
end;

procedure TTransferencia.SetNotaDeCompra(const Value: String);
begin
  FNotaDeCompra := Value;
end;

function TTransferencia.RetornaItemNota(const cStrChaveDoItem: String; var rStrItem, rStrNumero,
  rStrSerie, rStrEntidade: String): TItemNotaVenda;
begin
  rStrItem := Copy(cStrChaveDoItem, 1, 3);
  rStrNumero := Copy(cStrChaveDoItem, 4, 9);
  rStrSerie := trim(Copy(cStrChaveDoItem, 13, 3));
  rStrEntidade := Copy(cStrChaveDoItem, 16, 5);
  Result := TItemNotaVenda.Create;
  Result.Recuperar(rStrSerie, rStrNumero, rStrEntidade, rStrItem);
end;

function TTransferencia.RetornaItemPedido(const cStrChaveDoItem: String; var rStrItem, rStrPedido: String): TItemPedVenda;
begin
  rStrItem := Copy(cStrChaveDoItem, 2, 2);
  rStrPedido := Copy(cStrChaveDoItem, 4, 9);
  Result := TItemPedVenda.Create;
  Result.Recuperar(rStrPedido, rStrItem);
end;

function TTransferencia.RetornaEntidade: String;
var
  tq:TQuery;
  strSQL: String;

begin
  try
    tq := TQuery.Create(DmInt.Db);
    tq.DatabaseName := DmInt.Db.DatabaseName;
    tq.Active := false;

    strSQL := 'select ent_codigo from empresa where emp_codigo = ' + QuotedStr(EmpresaOrigem);

    tq.Close;
    tq.SQL.Clear;
    tq.Params.Clear;
    tq.SQL.Add(strSQL);
    tq.Open;

    Result := tq.FieldByName('ent_codigo').AsString;

  finally
    FreeAndNil(tq);

  end;

end;

function TTransferencia.RetornaSeEFaturado(const cStrPedido, cStrItem, cStrSerie, cStrNota, cStrEntidade: String): boolean;
var
  tq:TQuery;
  strSQL:String;
  
begin
  try
    tq := TQuery.Create(DmInt.Db);
    tq.DatabaseName := DmInt.Db.DatabaseName;
    tq.Active := false;

    strSQL := 'select ped_numero ' +

              'from movitempedvenda ' +

              'where ped_numero = ' + QuotedStr(cStrPedido) + ' and ' +
              '      ped_item = ' + cStrItem + ' and ' +
              '      nota_numero = ' + QuotedStr(cStrNota) + ' and ' +
              '      nota_serie = ' + QuotedStr(cStrSerie) + ' and ' +
              '      ent_codigo = ' + QuotedStr(cStrEntidade);

    tq.Close;
    tq.SQL.Clear;
    tq.Params.Clear;
    tq.SQL.Add(strSQL);
    tq.Open;

    if (tq.Eof) then begin
      Result := false;
    end else begin
      Result := true;
    end;

  finally
    tq.Close;
    FreeAndNil(tq);

  end;

end;

function TTransferencia.RetornaReferencia(const cStrProduto: String): String;
var
  tq:TQuery;
  strSQL:String;
  
begin
  try
    tq := TQuery.Create(DmInt.Db);
    tq.DatabaseName := DmInt.Db.DatabaseName;
    tq.Active := false;

    strSQL := 'select ref_codigo from referencia where pro_codigo = ' + QuotedStr(cStrProduto);

    tq.Close;
    tq.SQL.Clear;
    tq.Params.Clear;
    tq.SQL.Add(strSQL);
    tq.Open;

    if (tq.FieldByName('ref_codigo').AsString = '') then begin
      Result := cStrProduto;
    end else begin
      Result := tq.FieldByName('ref_codigo').AsString;
    end;

  finally
    tq.Close;
    FreeAndNil(tq);

  end;
  
end;

function TTransferencia.RetornaEmpresa(pEntidade: String): String;
var
  tq:TQuery;
  strSQL: String;

begin
  try
    tq := TQuery.Create(DmInt.Db);
    tq.DatabaseName := DmInt.Db.DatabaseName;
    tq.Active := false;

    strSQL := 'select emp_codigo from empresa where ent_codigo = ' + QuotedStr(pEntidade);

    tq.Close;
    tq.SQL.Clear;
    tq.Params.Clear;
    tq.SQL.Add(strSQL);
    tq.Open;

    Result := tq.FieldByName('emp_codigo').AsString;

  finally
    FreeAndNil(tq);

  end;


end;

end.
